#pragma once
#include <cstdint>
#include <cstdlib>

namespace safe_udp
{
    constexpr int MAX_PACKET_SIZE = 1472; // 应用层算上自己定义报头的可用长度
    constexpr int MAX_DATA_SIZE = 1460;   // 应用层有效载荷，1个数据包的有效载荷大小
    constexpr int HEADER_LENGTH = 12;
    // 数据段
    class DataSegment
    {
    public:
        DataSegment();
        ~DataSegment()
        {
            if (final_packet_ != nullptr)
            {
                free(final_packet_);
            }
        }

        char *SerializeToCharArray();    // 序列化
        void DeserializeToDataSegment(unsigned char *data_segment, int length); // 反序列化

        int seq_number_;       // 数据包序号
        int ack_number_;       // 确认序号
        bool ack_flag_;        // 确认标志位
        bool fin_flag_;        // 结束标志位
        uint16_t length_;      // 正文数据大小
        char *data_ = nullptr; // 正文数据

    private:
        uint32_t convert_to_uint32(unsigned char*buffer,int start_index);
        bool convert_to_bool(unsigned char*buffer,int index);
        uint16_t convert_to_uint16(unsigned char*buffer,int start_index);

        char*final_packet_=nullptr;//用来接收反序列化好的正文数据
    };

}